package com.rise.remi.controller;

import com.rise.remi.core.Core_v1;
import com.rise.remi.items.Item;
import com.rise.remi.items.TempNameSwitch;
import com.rise.remi.main.Main;
import com.rise.remi.network.Network;
import com.rise.remi.network.NetworkMessage;
import com.rise.remi.player.Player;
import com.rise.remi.world.CheckObstacles;
import com.rise.remi.world.World;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Random;

/**
 *
 * @author remi
 */
public class HeroController {

    private static Random rnd = new Random();

    public static void heroController(Player player, World world, KeyEvent ke) {
        int hero_xx = player.getX();
        int hero_yy = player.getY();

        //экземпляр клиента или сервера
        Network network = Main.getCore().getNetwork();

        //выводим в консоль абсолютные координаты игрока
        //System.out.println("Abs x: " + hero_xx + " - Abs y: " + hero_yy);
        //System.out.println("Abs x2: " + Test.core.getFriend().getX() + " - Abs y2: " + Test.core.getFriend().getY());
        //
        if (ke.getKeyCode() == KeyEvent.VK_DOWN && !(CheckObstacles.checkObstacle(world.getNullLayer().getTile(hero_xx, hero_yy + 1)))) {
            Core_v1.getInstance().getWorld().getWorldLayer().moveDown();
            network.sendData(new NetworkMessage(NetworkMessage.PLAYER_MOVEMENT, "d"));
        }
        //
        if (ke.getKeyCode() == KeyEvent.VK_UP && !(CheckObstacles.checkObstacle(world.getNullLayer().getTile(hero_xx, hero_yy - 1)))) {
            Core_v1.getInstance().getWorld().getWorldLayer().moveUp();
            network.sendData(new NetworkMessage(NetworkMessage.PLAYER_MOVEMENT, "u"));
        }
        //
        if (ke.getKeyCode() == KeyEvent.VK_LEFT && !(CheckObstacles.checkObstacle(world.getNullLayer().getTile(hero_xx - 1, hero_yy)))) {
            Core_v1.getInstance().getWorld().getWorldLayer().moveLeft();
            network.sendData(new NetworkMessage(NetworkMessage.PLAYER_MOVEMENT, "l"));
        }
        //
        if (ke.getKeyCode() == KeyEvent.VK_RIGHT && !(CheckObstacles.checkObstacle(world.getNullLayer().getTile(hero_xx + 1, hero_yy)))) {
            Core_v1.getInstance().getWorld().getWorldLayer().moveRight();
            network.sendData(new NetworkMessage(NetworkMessage.PLAYER_MOVEMENT, "r"));
        }

        //попробуем создать вещь по нажатию C и передать её на другой конец
        if (ke.getKeyCode() == KeyEvent.VK_C) {
            if (Main.getCore().getWorld().getItems().size() < 15) {
                int id = rnd.nextInt(6);
                int x = rnd.nextInt(30);
                int y = rnd.nextInt(30);

                Item itm = new Item(TempNameSwitch.switchName(id) + " (id: " + String.valueOf(id) + ")", id, x, y);

                if (!CheckObstacles.checkObstacle(Main.getCore().getWorld().getWorldLayer().getTile(x, y))) {
                    Main.getCore().getWorld().getItems().add(itm);
                    //готовим вещь к пересылке
                    synchronized (Main.getCore().getWorld().getItems()) {
                        Main.getCore().getNetwork().sendData(new NetworkMessage(NetworkMessage.SEND_ITEM, String.valueOf(itm.getId()) + ":" + String.valueOf(itm.getX()) + ":" + String.valueOf(itm.getY())));
                        System.out.println("Item sent.");
                    }
                } else {
                    System.out.println("Cannot spawn more than 15 items.");
                }
            }
        }
        //get item
        if (ke.getKeyCode() == KeyEvent.VK_G) {
            ArrayList<Item> inv = Main.getCore().getPlayer().getInventory();
            ArrayList<Item> items = Main.getCore().getWorld().getItems();
            Player p = Main.getCore().getPlayer();
            int x = p.getX(), y = p.getY();

            synchronized (Main.getCore().getWorld().getItems()) {
                //поиск вещи на карте мира, добавление в инвентарь, пересылка, удаление
                for (Item item : items) {
                    if ((item.getX() == x) && (item.getY() == y)) {
                        if (inv.size() < p.getInventorySize()) {
                            inv.add(item);
                            Main.getCore().getNetwork().sendData(new NetworkMessage(NetworkMessage.REMOVE_ITEM, String.valueOf(items.indexOf(item))));
                            items.remove(item);
                        }
                        break;
                    }
                }
            }
        }

        //показать/скрыть инвентарь
        if (ke.getKeyCode() == KeyEvent.VK_I) {
            Main.getCore().getInventory().toggleVisible();
        }
    }
}
